home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / FRMDIAL.C < prev    next >
C/C++ Source or Header  |  1992-04-05  |  10KB  |  379 lines

  1. /**************************************************************************
  2.  *
  3.  *************************************************************************/
  4.  
  5. #include "gemfast.h"
  6. #include "frmtypes.h"
  7.  
  8. #ifndef NULL
  9.   #define NULL 0L
  10. #endif
  11.  
  12. #define NO_FLAGS        (-1)
  13. #define BLITOPTIONS     (FRM_USEBLIT|FRM_MOVEABLE)
  14. #define CTL_ALLOCATED   0x80000000L
  15. /*-------------------------------------------------------------------------
  16.  *
  17.  *-----------------------------------------------------------------------*/
  18.  
  19. static int call_system_form_do(ctl)
  20.     register FormControl *ctl;
  21. {
  22.     return form_do(ctl->ptree, ctl->editobj);
  23. }
  24.  
  25. /*-------------------------------------------------------------------------
  26.  *
  27.  *-----------------------------------------------------------------------*/
  28.  
  29. long            (*_FrBltVector)()    = NULL;
  30. static int      (*default_form_do)() = call_system_form_do;
  31. long            _FrmDefaults  = FRM_NORMAL;
  32.  
  33. /*-------------------------------------------------------------------------
  34.  *
  35.  *-----------------------------------------------------------------------*/
  36.  
  37. static int find_mover_object(ptree)
  38.     register OBJECT *ptree;
  39. {
  40.     register OBJECT *pobj     = ptree;
  41.     register int     obj      = 0;
  42.     register int     ob_flags;
  43.  
  44.     for (;;) {
  45.         ob_flags = pobj->ob_flags;
  46.         if (ob_flags & FRM_MOVER) {
  47.             return obj;
  48.         }
  49.         if (ob_flags & LASTOB) {
  50.             return NO_OBJECT;
  51.         }
  52.         ++obj;
  53.         ++pobj;
  54.     }
  55. }
  56.  
  57. /*-------------------------------------------------------------------------
  58.  *
  59.  *-----------------------------------------------------------------------*/
  60.  
  61. FormControl *_FrmSetup(ctl, options, ptree, pboundrect)
  62.     register FormControl *ctl;
  63.     register long        options;
  64.     register OBJECT      *ptree;
  65.     register GRECT       *pboundrect;
  66. {
  67.     if (pboundrect == NULL) {
  68.         pboundrect = &gl_rwdesk;
  69.     }
  70.  
  71.     if (!(options & FRM_NODEFAULTS)) {
  72.         options |= _FrmDefaults;
  73.     }
  74.  
  75.     ctl->ptree        = ptree;
  76.     ctl->pboundrect   = pboundrect;
  77.     ctl->options      = options & FRM_OPTIONBITS;
  78.     ctl->form_do      = default_form_do;
  79.     ctl->editobj      = ROOT;
  80.     ctl->parentobj    = ROOT;
  81.     ctl->moverobj     = NO_OBJECT;
  82.     ctl->treeflags    = NO_FLAGS;
  83.     ctl->select_state = SELECTED;
  84.     ctl->blitbuffer   = NULL;
  85.  
  86.     if (options & FRM_DSTART) {
  87.         if (options & FRM_NEARMOUSE) {
  88.             int mx, my, dmy;
  89.             graf_mkstate(&mx, &my, &dmy, &dmy);
  90.             ptree->ob_x = mx - (ptree->ob_width  / 2);
  91.             ptree->ob_y = my - (ptree->ob_height / 2);
  92.             frm_confine(ptree, pboundrect);
  93.         } else if (options & FRM_CENTER) {
  94.             frmx_center(ptree, &ctl->scrnrect);
  95.         }
  96.     }
  97.  
  98.     frm_sizes(ptree, &ctl->scrnrect);
  99.     rc_scale(&ctl->scrnrect, &ctl->littlerect, 20);
  100.  
  101.     if (options & FRM_DSTART) {
  102.         if ((options & BLITOPTIONS) && _FrBltVector != NULL) {
  103.             long blitbytes;
  104.             blitbytes = (*_FrBltVector)(GRF_BMEMCALC, NULL, &ctl->scrnrect);
  105.             if (NULL != (ctl->blitbuffer = apl_malloc(blitbytes))) {
  106.                 ctl->moverobj = find_mover_object(ptree);
  107.                 if (ctl->moverobj == NO_OBJECT && (options & FRM_MOVEABLE)) {
  108.                     ctl->moverobj  = ROOT;
  109.                     ctl->treeflags = frm_mkmoveable(ptree, ROOT);
  110.                 }
  111.             }
  112.         }
  113.     }
  114.  
  115.     return ctl;
  116. }
  117.  
  118. /*-------------------------------------------------------------------------
  119.  *
  120.  *-----------------------------------------------------------------------*/
  121.  
  122. void frm_cleanup(ctl)
  123.     register FormControl *ctl;
  124. {
  125.     if (ctl != NULL) {
  126.         if (ctl->blitbuffer != NULL) {
  127.             apl_free(ctl->blitbuffer);
  128.         }
  129.         if (ctl->ptree != NULL && ctl->treeflags != NO_FLAGS) {
  130.             ctl->ptree->ob_flags = ctl->treeflags;
  131.         }
  132.         if (ctl->options & CTL_ALLOCATED) {
  133.             apl_free(ctl);
  134.         }
  135.     }
  136. }
  137.  
  138. /*-------------------------------------------------------------------------
  139.  *
  140.  *-----------------------------------------------------------------------*/
  141.  
  142. void *frm_init(options, ptree, pboundrect)
  143.     long        options;
  144.     OBJECT      *ptree;
  145.     GRECT       *pboundrect;
  146. {
  147.     FormControl *ctl;
  148.  
  149.     if (NULL == (ctl = apl_malloc((long)sizeof(*ctl)))) {
  150.         return NULL;
  151.     } else {
  152.         _FrmSetup(ctl, options|FRM_DSTART, ptree, pboundrect);
  153.         ctl->options |= CTL_ALLOCATED;
  154.         return ctl;
  155.     }
  156. }
  157.  
  158. /*-------------------------------------------------------------------------
  159.  *
  160.  *-----------------------------------------------------------------------*/
  161.  
  162. void frm_start(ctl)
  163.     register FormControl *ctl;
  164. {
  165.     if (ctl->blitbuffer != NULL) {
  166.         (*_FrBltVector)(GRF_BFROMSCREEN, ctl->blitbuffer, &ctl->scrnrect);
  167.     }
  168.  
  169.     frmx_dial(FMD_START, &ctl->littlerect, &ctl->scrnrect);
  170.  
  171.     if (ctl->options & FRM_EXPLODE) {
  172.         frmx_dial(FMD_GROW,  &ctl->littlerect, &ctl->scrnrect);
  173.     }
  174.  
  175. }
  176.  
  177. /*-------------------------------------------------------------------------
  178.  *
  179.  *-----------------------------------------------------------------------*/
  180.  
  181. void frm_draw(ctl, obj)
  182.     register FormControl *ctl;
  183.     int                  obj;
  184. {
  185.     objc_draw(ctl->ptree, obj, MAX_DEPTH, *ctl->pboundrect);
  186. }
  187.  
  188. /*-------------------------------------------------------------------------
  189.  *
  190.  *-----------------------------------------------------------------------*/
  191.  
  192. void frm_finish(ctl)
  193.     register FormControl *ctl;
  194. {
  195.     if (ctl->options & FRM_EXPLODE) {
  196.         frmx_dial(FMD_SHRINK, &ctl->littlerect, &ctl->scrnrect);
  197.     }
  198.  
  199.     if (ctl->blitbuffer != NULL) {
  200.         (*_FrBltVector)(GRF_BTOSCREEN, ctl->blitbuffer, &ctl->scrnrect);
  201.     } else {
  202.         frmx_dial(FMD_FINISH, &ctl->littlerect, &ctl->scrnrect);
  203.         evnt_timer(1,0);
  204.     }
  205.  
  206. }
  207.  
  208. /*-------------------------------------------------------------------------
  209.  *
  210.  *-----------------------------------------------------------------------*/
  211.  
  212. void frm_move(ctl)
  213.     register FormControl *ctl;
  214. {
  215.     int            oldmouse;
  216.     int            mb;
  217.     int            dmy;
  218.     register int   adjust;
  219.     register GRECT *prect = (GRECT *)&ctl->ptree->ob_x;
  220.  
  221.     if (ctl->blitbuffer == NULL) {
  222.         return;
  223.     }
  224.  
  225.     /*
  226.      * delay very briefly, then see if the mouse button is still down.
  227.      * if it's not, just return.  this prevents false 'moves' when all
  228.      * the user did was miss the button s/he was after.
  229.      */
  230.      
  231.     evnt_timer(10,0);
  232.     graf_mkstate(&dmy, &dmy, &mb, &dmy);
  233.     if (!mb) {
  234.         return;
  235.     }
  236.     
  237.     (*_FrBltVector)(GRF_BTOSCREEN, ctl->blitbuffer, &ctl->scrnrect);
  238.  
  239.     adjust = obj_clcalc(ctl->ptree, ROOT, NULL, NULL);
  240.     rc_gadjust(prect, adjust, adjust);
  241.  
  242.     oldmouse = graf_mouse(FLAT_HAND, NULL);
  243.     grfx_dragbox(prect, ctl->pboundrect, prect);
  244.     graf_mouse(oldmouse, NULL);
  245.  
  246.     adjust = -adjust;
  247.     rc_gadjust(prect, adjust, adjust);
  248.  
  249.     frm_sizes(ctl->ptree, &ctl->scrnrect);
  250.     (*_FrBltVector)(GRF_BFROMSCREEN, ctl->blitbuffer, &ctl->scrnrect);
  251.     frm_draw(ctl, ROOT);
  252. }
  253.  
  254. /*-------------------------------------------------------------------------
  255.  *
  256.  *-----------------------------------------------------------------------*/
  257.  
  258. int frm_do(ctl, editobj)
  259.     register FormControl *ctl;
  260.     int                  editobj;
  261. {
  262.     int oldmouse;
  263.     int rv;
  264.     int obj;
  265.  
  266.     if (ctl->options & FRM_MOUSEARROW) {
  267.         oldmouse = graf_mouse(ARROW, 0L);
  268.     }
  269.  
  270.     ctl->editobj = editobj;
  271.  
  272.     do  {
  273.         obj = 0x7FFF & (rv = (*ctl->form_do)(ctl));
  274.         if (rv == NO_OBJECT) {
  275.             goto QUICK_EXIT;
  276.         }
  277.         if (obj == ctl->moverobj) {
  278.             frm_move(ctl);
  279.         }
  280.     } while (obj == ctl->moverobj);
  281.  
  282.     if (ctl->ptree[obj].ob_flags & (EXIT|DEFAULT)) {
  283.         evnt_timer(70,0);
  284.         obj_stchange(ctl->ptree, obj, ~ctl->select_state,
  285.             OBJ_CLIPDRAW, ctl->pbo